﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Bukstor.Biz;

namespace Bukstor.UI.Miembros
{
    public partial class CompraDireccion : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        public IEnumerable<CompraDireccionRow> ObtenerDireccionesDelCliente()
        {
            BukstorBDEntities Entidades = new BukstorBDEntities();
            int idCliente = (int)Session["cliente"];
            Cliente C = Entidades.Clientes.First(i => i.id == idCliente);
            List<CompraDireccionRow> salida = new List<CompraDireccionRow>();

            if (!C.Direcciones.IsLoaded) C.Direcciones.Load();
            foreach (Direccion D in C.Direcciones)
            {
                salida.Add(new CompraDireccionRow(D.id, D.ToString()));
            }
            salida.Add(new CompraDireccionRow(-1, "Nueva..."));
            return salida;
        }



        protected void rdoDirecionesCargadas_SelectedIndexChanged(object sender, EventArgs e)
        {
            pnlDireccionNueva.Visible = rdoDirecionesCargadas.SelectedValue == "-1";
            btnPagar.Enabled = true;
        }

        protected void btnPagar_Click(object sender, EventArgs e)
        {
            Session["direccion"] = definirDireccion();

            Response.Redirect("~/Miembros/CompraPago.aspx", true);
        }

        /// <summary>
        /// Define la dirección que desea utilizar el cliente
        /// </summary>
        /// <returns>Develve el ID de la dirección seleccionada</returns>
        private int definirDireccion()
        {
            Direccion D;
            BukstorBDEntities Entidades = new BukstorBDEntities();
            int idElegido = int.Parse(rdoDirecionesCargadas.SelectedValue);
            if (idElegido != -1)
            {
                D = Entidades.Direcciones.First(i => i.id == idElegido);
            }
            else
            {
                string calle, depto, localidad, codPostal;
                int numero, idProvincia, idCliente;
                int? piso;
                Provincia P;
                Cliente C;
                calle = txtCalle.Text;
                numero = int.Parse(txtNumero.Text);
                piso = txtPiso.Text != "" ? (int.Parse(txtPiso.Text) as int?) : null;
                depto = txtDepartamento.Text;
                localidad = txtLocalidad.Text;
                codPostal = txtCodigoPostal.Text;
                idProvincia = int.Parse(ddlProvincia.SelectedValue);
                P = (from Provincia p in Entidades.Provincias where p.id == idProvincia select p).First();
                idCliente = (int)Session["cliente"];
                C = Entidades.Clientes.First(i => i.id == idCliente);

                D = Direccion.CreateDireccion(0, calle, numero, codPostal);
                D.departamento = depto;
                D.localidad = localidad;
                D.piso = piso;
                D.Provincia = P;
                D.Cliente = C;

                Entidades.AddToDirecciones(D);
                Entidades.SaveChanges();

                Entidades.Refresh(System.Data.Objects.RefreshMode.StoreWins, D);
            }
            return D.id;
        }

        /// <summary>
        /// Crea un nuevo pedido a partir de los datos del carrito y la direccion seleccionada
        /// </summary>
        /// <returns>Devuelve el ID del nuevo pedido</returns>
        private int crearPedido()
        {
            double importe = 0;
            DateTime fecha = DateTime.Now;
            Carrito carrito = Session["carrito"] as Carrito;
            List<Linea> detalle = new List<Linea>();
            BukstorBDEntities Entidades=new BukstorBDEntities();
            int idCliente=(int)Session["cliente"];
            int idDireccion=(int)Session["direccion"];
            Direccion direccion=Entidades.Direcciones.First(i => i.id == idDireccion);
            if (!direccion.ProvinciaReference.IsLoaded) direccion.ProvinciaReference.Load();
            if (!direccion.Provincia.CostoReference.IsLoaded) direccion.Provincia.CostoReference.Load();
            Pedido pedido;

            foreach (KeyValuePair<int,int> dupla in carrito.Compra)
            {
                Linea item = Linea.CreateLinea(0, dupla.Key, dupla.Value);
                detalle.Add(item);
                Libro L = Entidades.Libros.First(i => i.id == dupla.Key);
                if (!L.InventarioReference.IsLoaded) L.InventarioReference.Load();
                importe = importe + (double)L.Inventario.precioUnitario * dupla.Value;
            }

            pedido = Pedido.CreatePedido(0, importe, fecha);
            pedido.Cliente = Entidades.Clientes.First(i => i.id == idCliente);
            pedido.Direccion = direccion;
            pedido.entregaEstimada = fecha.AddDays(direccion.Provincia.Costo.plazo);
            pedido.Estado = Entidades.EstadosDeLosPedidos.First(i => i.idEstado == 1);
            // To Do: Terminar de crear el pedido y su detalle, devolver el ID del pedido creado.
            return pedido.id;
        }
    }
}
